package com.irssproject.app.web.interceptor;

import java.util.Calendar;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.irssproject.app.entitats.Reading;
import com.irssproject.app.service.lectorRSS.iface.SubscriptionsService;
import com.irssproject.app.utils.Constants;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class ReadingInterceptor extends AbstractInterceptor implements ServletRequestAware, SessionAware {

    private Map<String, Object> session;
    private HttpServletRequest request;
    SubscriptionsService subscripcioService;
    Logger logger = Logger.getLogger(ReadingInterceptor.class.getName());

    public ReadingInterceptor(SubscriptionsService subscripcioService) {
        this.subscripcioService = subscripcioService;
    }

    public void setSession(Map<String, Object> arg0) {
        session = arg0;
    }

    public Map<String, Object> getSession() {
        return session;
    }

    public void setServletRequest(HttpServletRequest arg0) {
        request = arg0;
    }

    public String intercept(ActionInvocation actionInvocation) throws Exception {

        request = ServletActionContext.getRequest();
        String idLecturaActual = (String) request.getParameter("idLectura");

        session = ActionContext.getContext().getSession();

        if (session.get(Constants.SESSIO_USUARI_AUTENTICAT) != null) {
            String idLecturaAnterior = (String) session.get(Constants.LECTURA_ANTERIOR);
            long temps = 0;

            if (session.get(Constants.COMPTADOR_TEMPS) != null) {
                temps = Calendar.getInstance().getTimeInMillis() - (Long) session.get(Constants.COMPTADOR_TEMPS);
            }

            if (idLecturaAnterior == null) {
                //El primer acces a un feed

                //Si s'ha clicat sobre un item... i a mes el link es null
                //Vol dir que es el primer item sobre el que cliquem en tota la sessio (no el primer item d'aquest feed, sino de tota la sessio!!)
                if (idLecturaActual != null) {
                    //A sessio no hi ha res
                    //Ho posem:
                    session.put(Constants.LECTURA_ANTERIOR, idLecturaActual);
                    //I comencem a comptar el temps
                    session.put(Constants.COMPTADOR_TEMPS, Calendar.getInstance().getTimeInMillis());
                }

            } //Si no es el primer acces a un feed ni a un item...
            else {
                boolean valoracio = session.get(Constants.MAGRADA) == null ? false : (Boolean)session.get(Constants.MAGRADA);


                Long idLectura = new Long(idLecturaAnterior);
                Reading lectura = subscripcioService.getReadingById(idLectura);
                lectura.setReadingTime(((float) temps) / 1000);
                subscripcioService.setReadingRelevance(lectura);

                logger.log(Level.INFO, "La lectura es {0}\n------> La valoracio de la lectura (true o false): {1}\n------> El temps emprat en llegir la lectura {2}", new Object[]{lectura.getItem().getTitle(), valoracio, temps});

                //Si ens arriba un espai en blanc
                //Vol dir que hem clicat sobre un feed i per tant haurem d'anotar el temps que s'ha trigat en llegir el ultim item que estavem llegint i el link anterior
                //Despres d'anotar el temps i el link, inicialitzem de nou el temps i el item
                if (idLecturaActual == null) {
                    session.put(Constants.LECTURA_ANTERIOR, null);

                } //Sino ens arriba un espai en blanc, vol dir que ens arriba un link valid
                //llavors el que haurem de fer es anotar el temps que s'ha trigat en llegir el ultim item que estavem llegint i el link anterior (de la sessio)
                //I a mes guardar el itemLink que ens arriba a la sessio i fer un checkpoint del comptador a la sessio
                else {
                    session.put(Constants.LECTURA_ANTERIOR, idLecturaActual);
                }
                session.put(Constants.COMPTADOR_TEMPS, Calendar.getInstance().getTimeInMillis());

            }

        }

        return actionInvocation.invoke();
    }
}
